package com.cs;

import java.io.FileNotFoundException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;

/**
 * @ClassName: MappedByteBufferTest
 * @Description: 可以让文件直接在内存中(堆外内存)修改，操作系统不需要拷贝一次
 * @Author: kevin
 * @Date: 2020/8/7 9:28
 * @Version: 1.0
 */
public class MappedByteBufferTest {
    public static void main(String[] args) throws Exception {
        RandomAccessFile randomAccessFile = new RandomAccessFile("C:\\Users\\kevin\\IdeaProjects\\other\\network_programming\\my_netty\\NIO_demo\\1.txt", "rw");

        // 获取对应的通道
        FileChannel channel = randomAccessFile.getChannel();
        /**
         * 参数一：FileChannel.MapMode.READ_WRITE 读写模式
         * 参数二：0，可以直接修改的起始位置
         * 参数三：5，是映射到内存的大小（不是索引位置），即将 1.txt 的多少字节映射到内存
         * 可以直接修改的范围就是 0--5
         *
         * 实际类型是 DirectByteBuffer
         */
        MappedByteBuffer mappedByteBuffer = channel.map(FileChannel.MapMode.READ_WRITE, 0, 5);
        mappedByteBuffer.put(0, (byte) 'H');
        mappedByteBuffer.put(3, (byte) '9');

        // 抛出异常 IndexOutOfBoundsException
//        mappedByteBuffer.put(5, (byte) 'Y');

        randomAccessFile.close();
        System.out.println("修改之后");

    }
}
